﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using CastleDefender.ConfigFolder;

namespace CastleDefender.Object
{
    public partial class Arrows : DrawableGameComponent
    {
        #region VARIABLE

        protected List<Arrow> lstArrows;
        protected Texture2D ttTexture;
        protected int intWidthFrame;
        protected int intHeightFrame;
        protected Vector2 vecPosition;
        protected int intType;
        protected int intAmount;
        protected float fltRotation;
        protected bool blnShoot;
        protected Rectangle recGameBounds;
        protected bool blnAvailable;

        #endregion

        #region CONSTRUCTOR

        public Arrows(Game myGame, ref Texture2D texture, int widthFrame, int heightFrame,Vector2 position, int type, int amount,
            float rotation, Rectangle gameBounds)
            : base(myGame)
        {
            lstArrows = new List<Arrow>();
            ttTexture = texture;
            intWidthFrame = widthFrame;
            intHeightFrame = heightFrame;
            vecPosition = position;
            intType = type;
            intAmount = amount + 1;
            fltRotation = rotation;
            recGameBounds = gameBounds;
            NewArrow();
            if (lstArrows.Count != 0)
                lstArrows[0].Visible = false;
        }

        #endregion

        #region PUBLIC METHOD

        public override void Update(GameTime gameTime)
        {
            if (intAmount < 0)
            {
                lstArrows.Clear();
                intAmount = 0;
            }

            if (lstArrows.Count != 0)
            {
                if (blnAvailable)
                {
                    lstArrows[0].Visible = true;
                }
                else
                {
                    lstArrows[0].Visible = false;
                }
            }

            for (int i = 0; i < lstArrows.Count; i++)
            {
                //Xét ẩn hiện của mũi tên
                if (!blnAvailable)
                {
                    if (lstArrows[i].Shoot)
                        lstArrows[i].Visible = true;
                }

                //Cập nhật danh sách mũi tên
                lstArrows[i].Update(gameTime);

                //Xóa mũi tên khi ra khỏi màn hình
                if (!lstArrows[i].Bounds.Intersects(recGameBounds) || !lstArrows[i].Enabled)
                {
                    lstArrows.RemoveAt(i);
                }
            }

            base.Update(gameTime);
        }

        public override void Draw(GameTime gameTime)
        {
            //Vẽ danh sách mũi tên
            for (int i = 0; i < lstArrows.Count; i++)
            {
                lstArrows[i].Draw(gameTime);
            }
            base.Draw(gameTime);
        }

        public void Attack(int power, float rotation, bool attack, bool touch, Vector2 vectorDirection)
        {
            blnShoot = attack;

            //Trường hợp đã hết tên và kích hoạt vật phẩm thêm tên
            if (lstArrows.Count == 0 && intAmount > 0)
            {
                NewArrow();
                lstArrows[0].Visible = false;
            }

            //Góc quay của tên khi đặt trên cung
            if (lstArrows.Count != 0 && blnAvailable)
            {
                lstArrows[0].Visible = true;
                lstArrows[0].Rotation = fltRotation = rotation;

                //Giai đoạn truyền lực chuẩn bị bắn tên
                if (touch)
                {
                    lstArrows[0].Position = vecPosition - vectorDirection / (Config.BowCountColumnFrame * 6);
                }

                else if (intAmount != 0)
                {
                    lstArrows[0].Position = vecPosition;
                }

                //Bắn tên
                if (blnShoot)
                {
                    lstArrows[0].Power = power;
                    lstArrows[0].Shoot = true;
                    NewArrow();
                }
            }      
        }

        #endregion

        #region PRIVATE METHOD

        //Lắp mũi tên mới vào 
        private void NewArrow()
        {
            intAmount = intAmount - 1 > 0 ? intAmount - 1 : 0;
            if (intAmount > 0)
            {
                Arrow newArrow = new Arrow(Game, ref ttTexture, intWidthFrame, intHeightFrame, vecPosition, fltRotation);
                lstArrows.Insert(0, newArrow);
            }
        }

        #endregion

        #region PUBLIC PROPERTIES

        //Nhận trả giá trị intType
        public int Type
        {
            get { return intType; }
            set { intType = value; }
        }

        //Nhận trả giá trị Amount
        public int Amount
        {
            get { return intAmount; }
            set { intAmount = value; }
        }

        //Nhận trả giá trị blnAttack
        public bool Shoot
        {
            get { return blnShoot; }
            set { blnShoot = value; }
        }

        //Nhận trả giá trị blnAvailable
        public bool Available
        {
            get { return blnAvailable; }
            set { blnAvailable = value; }
        }

        //Nhận trả giá trị lstArrows
        public List<Arrow> ListArrows
        {
            get { return lstArrows; }
            set { lstArrows = value; }
        }
        #endregion

        
    }
}
